<?php

/**
 * This is the model class for table "moja_baza.terminy".
 *
 * The followings are the available columns in table 'moja_baza.terminy':
 * @property integer $idTerminu
 * @property integer $idStanowiskoCwiczenie
 * @property string $data
 * @property integer $dzien_tygodnia
 * @property string $godzina_poczatek
 * @property string $godzina_koniec
 * @property string $powtarzalnosc
 *
 * The followings are the available model relations:
 * @property StanowiskoCwiczenie $idStanowiskoCwiczenie0
 */
class Terminy extends CActiveRecord
{
	/**
	 * Returns the static model of the specified AR class.
	 * @return Terminy the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'moja_baza.terminy';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('idStanowiskoCwiczenie, data, dzien_tygodnia, godzina_poczatek, godzina_koniec, powtarzalnosc', 'required'),
			array('idStanowiskoCwiczenie, dzien_tygodnia', 'numerical', 'integerOnly'=>true),
			array('powtarzalnosc', 'length', 'max'=>1),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('idTerminu, idStanowiskoCwiczenie, data, dzien_tygodnia, godzina_poczatek, godzina_koniec, powtarzalnosc', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'stanowiskoCwiczenie' => array(self::BELONGS_TO, 'StanowiskoCwiczenie', 'idStanowiskoCwiczenie'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'idTerminu' => 'Id Terminu',
			'idStanowiskoCwiczenie' => 'Id Stanowisko Cwiczenie',
			'data' => 'Data od',
			'dzien_tygodnia' => 'Dzień Tygodnia',
			'godzina_poczatek' => 'Początek',
			'godzina_koniec' => 'Koniec',
			'powtarzalnosc' => 'Powtarzalność',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search($cwiczenie=NULL)
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

                $criteria->order = 'dzien_tygodnia, godzina_poczatek';
		$criteria->compare('idTerminu',$this->idTerminu);
		if (!isset($cwiczenie))
                    $criteria->compare('idStanowiskoCwiczenie',$this->idStanowiskoCwiczenie);
                else {
                    $sc = array();
                    $modelStaCwi = StanowiskoCwiczenie::model()->findAllByAttributes(array('idCwiczenia'=>$cwiczenie));
                    foreach($modelStaCwi as $m) {
                        $sc[] = $m->idStanowiskoCwiczenie;
                    }
                    $criteria->compare('idStanowiskoCwiczenie',$sc);
                }
                $criteria->compare('data',$this->data,true);
		$criteria->compare('dzien_tygodnia',$this->dzien_tygodnia);
		$criteria->compare('godzina_poczatek',$this->godzina_poczatek,true);
		$criteria->compare('godzina_koniec',$this->godzina_koniec,true);
		$criteria->compare('powtarzalnosc',$this->powtarzalnosc,true);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        
        /*public function getDostepneTerminy($tydzien, $idCwiczenia) {
            $result = array();
            $terminy = Terminy::model()->findAllByAttributes(array('idCwiczenia'=>$idCwiczenia));
            
            for ($i = 0; $i < 7; $i++) {
                
            }
        
        }*/
        public function getDostepneTerminy($tydzien, $idCwiczenia) {
                $result = array();
                
                $fill = array();
                $stanowiskocwiczenie = StanowiskoCwiczenie::model()->findAllByAttributes(array('idCwiczenia'=>$idCwiczenia));
                foreach ($stanowiskocwiczenie as $sc)
                    $fill[$sc->idStanowiska] = 'F';
                    //F(ree) - nic tu nie ma

                for ($i = 0; $i < 7; $i++) {
                    $dzien = strtotime(date('Y-m-d', $tydzien+$i*24*60*60));
                    $result[] = array_fill(0, 96, $fill);
                    $dzienFormated = date('Y-m-d', $dzien);
                    $dzienTygodnia = date('N', $dzien) - 1;
                    
                    $terminy = Terminy::model()->findAllBySql("
                        SELECT *
                          FROM terminy ter, stanowisko_cwiczenie sc
                         WHERE ter.idStanowiskoCwiczenie = sc.idStanowiskoCwiczenie
                           AND sc.idCwiczenia <> ".$idCwiczenia."
                           AND ((ter.powtarzalnosc = 'W' AND ter.data <= '".$dzienFormated."' AND
                               ter.dzien_tygodnia = ".$dzienTygodnia." AND NOT EXISTS
                                (SELECT 1
                                    FROM terminy c2
                                   WHERE ((c2.data = '".$dzienFormated."' AND c2.powtarzalnosc = 'D') OR
                                         (ter.data < c2.data AND c2.data <= '".$dzienFormated."' AND
                                         c2.dzien_tygodnia = ter.dzien_tygodnia AND
                                         c2.powtarzalnosc = 'W'))
                                     AND c2.idStanowiskoCwiczenie = ter.idStanowiskoCwiczenie)) OR
                               (ter.data = '".$dzienFormated."' AND ter.powtarzalnosc = 'D'))
                    ");
                    foreach ($terminy as $t) {
                        for ($j = strtotime(date('Y-m-d', $dzien).' '.$t->godzina_poczatek); $j < strtotime(date('Y-m-d', $dzien).' '.$t->godzina_koniec); $j+=900) {
                            $j_ = (int)date('G', $j) * 4 + (int)((int)date('i', $j) / 15);
                            if (!isset($result[$i][$j_])) {
                                $result[$i][$j_] = array();
                            }
                            $result[$i][$j_][$t->stanowiskoCwiczenie->idStanowiska] = 'A';
                            //A(nother) - tu jest termin innego ćwiczenia
                        }
                    }
                    
                    $terminy = Terminy::model()->findAllBySql("
                        SELECT * FROM terminy ter, stanowisko_cwiczenie sc
                        WHERE ter.idStanowiskoCwiczenie = sc.idStanowiskoCwiczenie AND 
                        sc.idCwiczenia = ".$idCwiczenia." AND (
                        (
                                ter.powtarzalnosc = 'W'
                                AND ter.data <= '".$dzienFormated."'
                                AND ter.dzien_tygodnia = ".$dzienTygodnia."
                                AND NOT EXISTS (
                                        SELECT 1 FROM terminy c2
                                        WHERE (
                                                (
                                                        c2.data = '".$dzienFormated."'
                                                        AND c2.powtarzalnosc = 'D'
                                                ) OR (
                                                        ter.data < c2.data
                                                        AND c2.data <= '".$dzienFormated."'
                                                        AND c2.dzien_tygodnia = ter.dzien_tygodnia
                                                        AND c2.powtarzalnosc = 'W'
                                                )
                                        )
                                        AND c2.idStanowiskoCwiczenie = ter.idStanowiskoCwiczenie
                                )
                        ) OR (
                                ter.data = '".$dzienFormated."'
                                AND ter.powtarzalnosc = 'D'
                        ))");
                    foreach ($terminy as $t) {
                        for ($j = strtotime(date('Y-m-d', $dzien).' '.$t->godzina_poczatek); $j < strtotime(date('Y-m-d', $dzien).' '.$t->godzina_koniec); $j+=900) {
                            $j_ = (int)date('G', $j) * 4 + (int)((int)date('i', $j) / 15);
                            if (!isset($result[$i][$j_])) {
                                $result[$i][$j_] = array();
                            }
                            $result[$i][$j_][$t->stanowiskoCwiczenie->idStanowiska] = 'T';
                            //T(ermin) - tu istnieje termin wskazanego ćwiczenia
                        }
                    }
                    
                    $rezerwacje = Rezerwacja::model()->findAllBySql("
                        SELECT *
                          FROM rezerwacja rez, stanowisko_cwiczenie sc
                         WHERE rez.idStanowiskoCwiczenie = sc.idStanowiskoCwiczenie
                           AND sc.idCwiczenia = ".$idCwiczenia."
                           AND rez.poczatek >= '".$dzienFormated." 00:00:00'
                           AND rez.koniec <= '".$dzienFormated." 23:59:50'
                    ");
                    foreach ($rezerwacje as $r) {
                        for ($j = strtotime($r->poczatek); $j < strtotime($r->koniec); $j+=900) {
                            $j_ = (int)date('G', $j) * 4 + (int)((int)date('i', $j) / 15);
                            if (!isset($result[$i][$j_])) {
                                $result[$i][$j_] = array();
                            }
                            $result[$i][$j_][$r->stanowiskoCwiczenie->idStanowiska] = 'R';
                            // R(eservation) - termin wskazanego ćwiczenia zarezerwowany przez użytkownika
                        }
                    }
                }
                
                

                /*if (isset($idLekarz)) {
                    $wizyty = Wizyta::model()->findAll('Termin >= :od AND Termin < :do AND idLekarz = :lekarz',
                        array(':od' => date('Y-m-d', $tydzien).' 00:00:00',
                              ':do' => date('Y-m-d', $tydzien + (7 * 24 * 60 * 60)).' 00:00:00',
                              ':lekarz' => $idLekarz));
                } else {
                    $wizyty = Wizyta::model()->findAll('Termin >= :od AND Termin < :do',
                        array(':od' => date('Y-m-d', $tydzien).' 00:00:00',
                              ':do' => date('Y-m-d', $tydzien + (7 * 24 * 60 * 60)).' 00:00:00'));
                }

                foreach ($terminy as $t) {
                    $term = strtotime($w->Termin);
                    if ($term < time())
                        continue;
                    $i = date('N', $term)-1;
                    $j = (int)date('G', $term) * 4 + (int)((int)date('i', $term) / 15);
                    $result[$i][$j][$w->idLekarz] = 'R';
                    
                }*/

                return $result;
        }
        
        public function monthPLtoNum($m) {
            switch($m) {
                case 'Sty': return 1;
                case 'Lut': return 2;
                case 'Mar': return 3;
                case 'Kwi': return 4;
                case 'Maj': return 5;
                case 'Cze': return 6;
                case 'Lip': return 7;
                case 'Sie': return 8;
                case 'Wrz': return 9;
                case 'Paź': return 10;
                case 'Lis': return 11;
                case 'Gru': return 12;
            }
        }

        public function dayPL($d) {
            switch($d) {
                case 1: return 'poniedziałek';
                case 2: return 'wtorek';
                case 3: return 'środa';
                case 4: return 'czwartek';
                case 5: return 'piątek';
                case 6: return 'sobota';
                case 7: return 'niedziela';

            }
        }

        public function monthPL($m) {
            switch($m) {
                case 1: return 'Sty';
                case 2: return 'Lut';
                case 3: return 'Mar';
                case 4: return 'Kwi';
                case 5: return 'Maj';
                case 6: return 'Cze';
                case 7: return 'Lip';
                case 8: return 'Sie';
                case 9: return 'Wrz';
                case 10: return 'Paź';
                case 11: return 'Lis';
                case 12: return 'Gru';
            }
        }
}